package com.kimehwa.studyboot.basejava.annotationmytest;

import java.lang.reflect.Method;
import java.util.ArrayList;

/**
 * 读取注解并进行反射操作，相当于注解看不到的地方
 * 在隐秘的角落给我们执行了@Test的注解
 */
public class MyJunitFrameWork {
    public static void main(String[] args) throws Exception {
        // 获取内部类
        Class<EmployeeDAOTest> clazz = EmployeeDAOTest.class;
        // 这里进行向上转型
        Object obj = clazz.getDeclaredConstructor().newInstance();

        // 获取emplyDAOTest中的所有方法
        Method[] methods = clazz.getMethods();

        // 迭代每一个Method对象，判断那些方法用了这几个注解
        ArrayList<Method> myBeforeList = new ArrayList<>();
        ArrayList<Method> myAfterList = new ArrayList<>();
        ArrayList<Method> myTestList = new ArrayList<>();
        for (Method method : methods) {
            if (method.isAnnotationPresent(MyBefore.class)) {
                myBeforeList.add(method);
            } else if (method.isAnnotationPresent(MyTest.class)) {
                //存储使用了@MyTest注解的方法对象
                myTestList.add(method);
            } else if (method.isAnnotationPresent(MyAfter.class)) {
                //存储使用了@MyAfter注解的方法对象
                myAfterList.add(method);
            }
        }
        for (Method testMethod : myTestList) {
            // 先执行before的方法
            for (Method beforeMethod : myBeforeList) {
                // 这里是传入具体的obj 来决定方法执行的是哪个类
                beforeMethod.invoke(obj);
            }
            testMethod.invoke(obj);
            // 最后执行@MyAfter的方法
            for (Method afterMethod : myAfterList) {
                afterMethod.invoke(obj);
            }
        }
    }
}
